package com.cgy.utils.base.classes;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 类处理
 *
 * @author Administrator
 */
public class ClassHelper<T> {

    /**
     * 获取所有字段以及类型
     *
     * @param <T>
     * @param item
     * @return
     */
    public static final <T> Map<String, String> paramNameAndType(final T item) {
        return paramNameAndType(item, null);
    }

    /**
     * 获取字段以及类型
     *
     * @param <T>
     * @param item
     * @param fields
     * @return
     */
    public static final <T> Map<String, String> paramNameAndType(T item, List<String> fields) {
        Map<String, String> result = new HashMap<>();

        String name;
        Field[] fields1 = item.getClass().getDeclaredFields();
        for (Field field : fields1) {
            name = field.getName();
            if (null == fields || fields.indexOf(name) > -1) {
                result.put(name, field.getType().getName());
            }
        }
        return result;
    }

    /**
     * 获取字段以及类型
     *
     * @param <T>
     * @param item
     * @return
     */
    public static final <T> int paramSize(T item) {
        return paramName(item).size();
    }

    /**
     * 获取字段以及类型
     *
     * @param <T>
     * @param item
     * @return
     */
    public static final <T> List<String> paramName(T item) {
        return paramName(item, null);
    }

    /**
     * 获取字段
     *
     * @param <T>
     * @param item
     * @param fields
     * @return
     */
    public static final <T> List<String> paramName(T item, final List<String> fields) {
        List<String> result = new ArrayList<>();

        String name;
        Field[] fields1 = item.getClass().getDeclaredFields();
        for (Field field : fields1) {
            name = field.getName();
            if (null == fields || fields.indexOf(name) > -1) {
                result.add(name);
            }
        }
        return result;
    }

    /**
     * 获取字段的值
     *
     * @param <T>
     * @param item
     * @return
     */
    public static final <T> Object invoke(T item, final String oneField) {
        Field[] fields1 = item.getClass().getDeclaredFields();
        for (Field field : fields1) {
            if (null != oneField && oneField.indexOf(field.getName()) > -1) {
                field.setAccessible(true);
                try {
                    return field.get(item);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }
}
